'''
 Semaphore：
    Semaphore 在内部管理着一个计数器。调用 acquire() 会使这个计数器 -1，release() 则是+1(可以多次release()，
    所以计数器的值理论上可以无限).计数器的值永远不会小于 0，当计数器到 0 时，再调用 acquire() 就会阻塞，直到其他线程来调用release()
'''

import threading
from time import sleep,ctime

def run(n):
    ##获取信号量，信号量减1
    semaphore.acquire()
    sleep(2)
    print("run the thread: %s" % n)
    # 释放信号量，信号量加一
    semaphore.release()
    #semaphore.release()  # 可以多次释放信号量，每次释放计数器+1
    #semaphore.release()  # 可以多次释放信号量，每次释放计数器+1

if __name__ == "__main__":
    num = 0
    semaphore = threading.Semaphore(2)
    for i in range(20):
        t = threading.Thread(target=run,args=(i,))
        t.start()
while threading.active_count !=1:
    pass
else:
    print('----all threads done---')
    print(num)



